using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using UnityHelpers;
using System.Linq;
using Unity.VisualScripting;

namespace Game
{
    /**
     * 游戏主应用类 (GameApp)
     * 
     * 功能说明：
     * - 游戏的核心管理类，负责整个游戏的生命周期管理
     * - 使用单例模式，确保全局只有一个实例
     * - 管理游戏状态机，控制游戏流程
     * - 协调各个初始化器，完成游戏启动
     * 
     * 设计模式：
     * - 单例模式 (Singleton Pattern)
     * - 状态模式 (State Pattern)
     * - 策略模式 (Strategy Pattern) - 通过初始化器
     * 
     * 生命周期：
     * 1. Awake: 单例初始化，设置为常驻对象
     * 2. Start: 初始化状态机和游戏系统
     * 3. Update: 更新状态机
     */
    public class GameApp : SingletonBehaviour<GameApp>
    {
        // 生命周期事件
        public event Action OnAwake;
        public event Action OnStart;
        public event Action OnQuit;

        private bool _isInitialized = false;

        /**
         * 游戏状态机
         * 
         * 说明：
         * - 管理游戏的各种状态（Logo、Login、Main、Battle等）
         * - 控制游戏流程的切换
         * - 每帧更新当前状态
         */
        public StateMachine<GameApp> StateMachine { get; private set; }

        /**
         * Unity生命周期：Awake方法
         * 
         * 功能：
         * - 单例模式的初始化
         * - 设置对象为常驻对象，不被场景切换销毁
         * - 防止重复创建实例
         */
        protected override void Awake()
        {
            base.Awake();
            DontDestroyOnLoad(gameObject);
        }

        public bool IsInitialized { get { return _isInitialized; } }

        /**
         * 初始化游戏系统
         * 
         * 功能：
         * - 获取所有GameInitializer组件
         * - 按优先级排序初始化器
         * - 依次执行初始化操作
         * 
         * 设计说明：
         * - 使用组件模式，支持多个初始化器
         * - 通过优先级控制初始化顺序
         * - 便于扩展和维护
         */
        // private void Initialize()
        // {
        //     Debug.Log("GameApp: 开始初始化游戏系统");

        //     this.OnAwake?.Invoke();

        //     // 获取所有GameInitializer组件
        //     GameInitializer[] initializers = GetComponents<GameInitializer>();

        //     // 根据优先级排序（因为添加组件的时候调用顺序不一定好控制）
        //     Array.Sort(initializers, (a, b) => a.priority.CompareTo(b.priority));

        //     // 依次执行初始化
        //     foreach (var initializer in initializers)
        //     {
        //         Debug.Log($"GameApp: 执行初始化器 - {initializer.GetType().Name}");
        //         initializer.BeginInitialize(this);
        //     }

        //     // 启动插件
        //     PluginManager.Instance.Init();

        //     // 启动服务
        //     ServiceManager.Instance.Init();     

        //     // 后初始化
        //     foreach (var initializer in initializers)
        //     {
        //         initializer.PostInitialize(this);
        //     }

        //     Debug.Log("GameApp: 游戏系统初始化完成");
        // }

        // 协程启动初始化
        private IEnumerator InitializeCoroutine()
        {
            // 获取所有GameInitializer组件
            GameInitializer[] initializers = GetComponents<GameInitializer>();

            // 根据优先级排序（因为添加组件的时候调用顺序不一定好控制）
            Array.Sort(initializers, (a, b) => a.priority.CompareTo(b.priority));

            // 前初始化
            foreach (var initializer in initializers)
            {
                initializer.BeginInitialize(this);
            }

            yield return new WaitUntil(() => initializers.All(i => i.IsCompleted));

            // 启动插件
            PluginManager.Instance.Init();

            // 启动服务
            ServiceManager.Instance.Init();

            // 后初始化
            foreach (var initializer in initializers)
            {
                initializer.PostInitialize(this);
            }

            this.OnStart?.Invoke();
            _isInitialized = true;
        }

        /**
         * Unity生命周期：Start方法
         * 
         * 功能：
         * - 初始化状态机
         * - 执行游戏系统初始化
         * - 启动游戏主流程
         */
        void Start()
        {
            Debug.Log("GameApp Start - 游戏主应用启动");

            // 初始化状态机，传入自身作为持有者
            StateMachine = new StateMachine<GameApp>(this);
            Debug.Log("GameApp: 状态机初始化完成");

            this.OnAwake?.Invoke();
            StartCoroutine(InitializeCoroutine());
        }

        /**
         * Unity生命周期：Update方法
         * 
         * 功能：
         * - 每帧更新状态机
         * - 确保当前状态得到及时更新
         * - 处理状态切换和状态逻辑
         */
        void Update()
        {
            if (!_isInitialized)
            {
                return;
            }

            // 更新状态机，处理当前状态的逻辑
            StateMachine.Update();
        }

        protected override void OnDestroy()
        {
            this.OnQuit?.Invoke();

            // 销毁插件
            PluginManager.Instance.Destroy();

            base.OnDestroy();
        }
    }
}